﻿using System.Collections.Generic;

namespace Wlx.LogAnalysis.Application.Models
{
    public static partial class StringPatternFormatter
    {
        /// <summary>
        /// 匹配一个数字字符。等价于 [0-9]
        /// </summary>
        public const string 数字 = "\\d";

        /// <summary>
        /// 匹配一个非数字字符。等价于 [^0-9]
        /// </summary>
        public const string 非数字 = "\\D";

        /// <summary>
        /// 匹配一个换行符。等价于 \x0a 和 \cJ
        /// </summary>
        public const string 换行符 = "\\n";

        /// <summary>
        /// 匹配除 "\n" 之外的任何单个字符
        /// </summary>
        public const string 非换行符 = ".";

        /// <summary>
        /// 匹配任何空白字符，包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]
        /// </summary>
        public const string 空白字符 = "\\s";

        /// <summary>
        /// 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
        /// </summary>
        public const string 非空白字符 = "\\S";

        /// <summary>
        /// 匹配包括下划线的任何单词字符。等价于’[A-Za-z0-9_]’
        /// </summary>
        public const string 单词字符 = "\\w";

        /// <summary>
        /// 匹配任何非单词字符。等价于 ’[^A-Za-z0-9_]’
        /// </summary>
        public const string 非单词字符 = "\\W";

        /// <summary>
        /// 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性，^ 也匹配 ’\n’ 或 ’\r’ 之后的位置
        /// </summary>
        public const string 起始符 = "^";

        /// <summary>
        /// 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性，$ 也匹配 ’\n’ 或 ’\r’ 之前的位置
        /// </summary>
        public const string 结束符 = "$";

        /// <summary>
        /// 匹配前面的子表达式零次或多次。例如，zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}
        /// </summary>
        public const string 大于等于0次 = "*";

        /// <summary>
        /// 匹配前面的子表达式一次或多次。例如，’zo+’ 能匹配 "zo" 以及 "zoo"，但不能匹配 "z"。+ 等价于 {1,}。
        /// </summary>
        public const string 大于0次 = "+";

        /// <summary>
        /// 匹配前面的子表达式零次或一次。例如，"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}
        /// </summary>
        public const string 至多1次 = "?";
    }


    public static partial class StringPatternFormatter
    {
        public static string 一到多个单词字符 = 单词字符.一次或多次();
        public static string 一到多个空白字符 = 空白字符.一次或多次();
        public static string 一到多个非空白字符 = 非空白字符.一次或多次();
        public static string 零到多个空白字符 = "\\s*";

        public static string 提取(string str)
        {
            return "(" + str + ")";
        }
        public static string 或者(this string str, params string[] otherStr)
        {
            var list = new List<string> { str };
            if(otherStr != null && otherStr.Length > 0)
            {
                list.AddRange(otherStr);
            }

            var result = "[" + string.Join("|", list) + "]";
            return result;
        }

        public static string 一次或多次(this string str)
        {
            return str + "+";
        }
    }
}
